參考網站:Keras官方指南
如果想要看各個神經元最初設定的權重,輸入以下程式:
layer = layers.Dense(4)
print(layer.weights)
但出現的結果是:
[]
這是因為在keras程式中,必須先有輸入值才會產生權重,不然會出現空集合。因此如果用以下方式:
layer = layers.Dense(4)
y = layer(tf.ones((3,4,2)))
print(layer.weights)
則會產生權重,而且有趣的是,每次執行都會產生不一樣的權重,這也表示每次在訓練都會以不同值作為訓練,不必自己手動調整:
[<tf.Variable 'dense_5/kernel:0' shape=(2, 4) dtype=float32, numpy=
array([[-0.03356194, 0.3569517 , -0.8341913 , 0.73365426],
[-0.10828733, 0.30690932, -0.19653058, 0.02371168]],
dtype=float32)>, <tf.Variable 'dense_5/bias:0' shape=(4,) dtype=float32, numpy=array([0., 0., 0., 0.], dtype=float32)>]
[<tf.Variable 'dense_6/kernel:0' shape=(2, 4) dtype=float32, numpy=
array([[ 0.50712013, -0.64136124, -0.3829267 , 0.5257573 ],
[-0.7684462 , 0.03535271, 0.4861548 , 0.5680456 ]],
dtype=float32)>, <tf.Variable 'dense_6/bias:0' shape=(4,) dtype=float32, numpy=array([0., 0., 0., 0.], dtype=float32)>]
輸出結果會發現有兩個tf.Variable,前面是只權重的部分,後面是偏差值。
在權重部分中,我看到kernel,以為是只作業系統上的軟體和硬體之間的溝通,後來才想到:「這不是作業系統啊」,因此就調查了一下為何機器學習中有kernel。
在機器學習裡,kernel可以用來協助區分資料,使得可以更快速建立基本架構,一般來說在低維度的空間,資料可能會混雜在同一個區塊中,很難找到適合的線性方式,因此使用kernel可以將基本資料切換成多個維度,從平面變成立體的架構,就有可能可以找到適合的線性方式,不必用非線性的方式了。
上述提到,總結kernel有兩個重點:樣本的相似性以及加權。不得不說機器學習中有很重要的概念:要得到自己想要的結果,那就在訓練集中先找到相似的樣本,將那些樣本拿來訓練,就能得到想要的結果了。因此kernel就可以被用來找到距離最近點進行訓練、區分,且距離越近的點所設定的權重會越大,表示相似度越高,最後在用線性回歸調整權重數值,以訓練玩結果。
輸出結果中的array中的各個數字就是各個神經元的權重,在上一篇激勵函數中有提到,因為只會看最後一個數來決定該輸入層有多少個神經元,因此權重的個數僅有8個,若要表示輸入層,則如圖(一)。
以tf.ones(3,4,2)格式會是這樣:
[[[1. 1.]
[1. 1.]
[1. 1.]
[1. 1.]]
[[1. 1.]
[1. 1.]
[1. 1.]
[1. 1.]]
[[1. 1.]
[1. 1.]
[1. 1.]
[1. 1.]]]
則圖(一)的輸入層有兩個神經元,第一個會取矩陣當中的第一行數字,第二個則取第二行。
最後偏差值的部分,偏差因為是先把資料乘上權重且加總完畢之後,才會加入偏差值,因此可以看到偏差的個數是根據layer個數而定,且目前每個值都是設定為0。